Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

200
Views
Is the format specifier %[^\n]s legal in C89?

I'm reading a string from sdin with a scanf by doing:

scanf("%[^\n]s", msg);

%[^\n]s reads till a new line character is found. Is this legal in ANSI-C?

over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

You should not use this format for multiple reasons:

  • The s in "%[^\n]s" is not part of the conversion specifier, it is a plain character that scanf will try to match after the characters read from the line, at a time where the current character is either a newline or the end of file. You should remove the s.

  • scanf("%[^\n]", msg); will fail and return 0, leaving msg unchanged if the user hits enter with an empty input line.

  • scanf("%[^\n]", msg); will cause a buffer overflow for any sufficiently long input line. The maximum number of characters to store into the array pointed to by msg should be specified between the % and the [ as:

      char buf[100];
      if (scanf("%99[^\n]", msg) == 1) {
          // msg contains the input line, up to 99 characters
          // the remainder if this input line is still in stdin
          // so is the newline
      }
    
  • scanf("%99[^\n]", msg); does not consume the newline and leaves extra characters in the input stream if more than 99 were typed before the newline, which may of may not be the expected behavior.

Here is a safer alternative:

// read a line of input, discard extra characters and the trailing newline
int mygets(char *dest, size_t size) {
    int c;
    size_t i = 0;
    while ((c = getchar()) != EOF && c != '\n') {
        if (i + 1 < size) {
            dest[i++] = c;
        }
    }
    if (size > 0)
        dest[i] = '\0';
    if (c == EOF && (i == 0 || ferror(stdin)))
        return EOF;
    else
        return (int)i;
}
over 4 years ago · Santiago Trujillo Report

0

Is the format specifier %[^\n]s legal in C89?

Yes, it's "legal", as in the behavior will be defined.

The %[^\n] will scan anything except a newline character. s will scan an s. s will never match, because there will be a newline in the buffer, or an error condition. Still, it's "valid".

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!